---------------------------------------------------------------------------- README About this report. Report Name: CL507 Report Date: 12/18/90 Author: Compiled by Jo W. French dba Practical Computing of La Canada 290 Starlight Crest Drive La Canada, CA 91011 (818) 790-3699 CompuServe ID: 74730,1751 Notes: Supercedes CL506. See Credits. ~ indicates change from last issue. This report pertains to Clipper(r) 5.0. Each item herein contains the applicable version number. It has been compiled from messages posted on CompuServe forums from 09/15/90 through 12/17/90. The author has verified most, but not all, of the stated anomalies. The severity of each item is best left to the reader's judgement; however, those items which will 'crash' the system are so noted. Verification Conditions. a) COMPILER: Clipper 5.0 version 1.03 dtd 09/15/90. b) LINKER: RTLINK version 3.11 as supplied by lanquage vendor. No Incremental Linking was used. c) SYSTEM: IBM PS/2 Model 80 with 4Mb RAM, 222 Mb Fixed Disk. d) DOS Version: IBM DOS version 3.30. e) CONFIG.SYS: DEVICE=c:\dos\vdisk.sys 1536 512 128 /E DEVICE=c:\qemm\qemm.sys RAM SHELL=c:\command.com /E:512 /P FILES=51 BUFFERS=8 f) ENVIRONMENT COMSPEC=C:\COMMAND.COM PROMPT=$p$g PATH=C:\dos;C:\bat;C:\;C:\me;C:\ws5;F:\clipper5\bin;D:\trh; C:\qemm;F:\ng; LIB=F:\clipper5\lib; INCLUDE=F:\clipper5\include; OBJ=F:\clipper5\obj; PLL=F:\clipper5\pll; CLIPPER=F21; g) EXTENDED MEMORY: 1536Kb (DOS VDISK) h) EXPANDED MEMORY: 1536Kb (QEMM vs. 5.0) i) TSR's: All TSR's are loaded above 9FFF using QEMM's LOADHI. ---------------------------------------------------------------------------- Credits That's Thanks Folks! My Thanks to the Sysops and Members of CompuServe for their countless hours of cussing, working and losing sleep to present solutions to the anomalies presented herein. Keep up the Good Work! This is NOT an official Nantucket(r) publication. Please report errors and ommissions to: Jo W. French 74730,1751 Note: See Read Me ---------------------------------------------------------------------------- ACOPY() Fails to copy under certain conditions. Clipper Version 1.03 dtd 09/15/90. Problem Statement ACOPY() fails to copy when the 4th parameter, , is NIL in a parameter list; e.g., ACOPY(, , , , ). Cause Unknown. is apparently defaulting to 0 in this incidence. Work Around(s) Place a valid number in this parameter position; e.g., ACOPY(, , , LEN(), ). Notes ACOPY(, ) works satisfactorily for a complete copy. ---------------------------------------------------------------------------- AEVAL() Undocumented return reference. Clipper Version 1.03 dtd 09/15/90. Problem Statement AEVAL() documentation does not mention the presence of a second return reference; i.e., the element number. Cause Documentation omission. Work Around(s) Annotate your documentation. Notes This permits things like the following: AEVAL(array, { | value, element | array[element] = value * 2 } ) which replaces each element with 2 times the original value. seealso "DBEVAL()" ---------------------------------------------------------------------------- ALLTRIM() Returns runtime error if embedded in a macro. Clipper Version 1.03 dtd 09/15/90. Problem Statement When ALLTRIM(cVar) is included in a macro statement, a runtime error occurs when the macro is expanded. Cause ALLTRIM(cVar) is a psuedo-function, created by directive in STD.CH; i.e., #translate Alltrim() => Ltrim(Trim( )) Work Around(s) 1) Create a real function, ALLTRIM(cVar), in your .PRG; e.g., FUNCTION ALLTRIM PARAMETERS cVar RETURN LTRIM(TRIM(cVar)) 2) Create the above function and compile using the /N option. Include the resultant .OBJ file when linking. Note: You may delete the #translate line from MYNAME.CH. 3) Create the above function and compile using the /N option. Add the resultant .OBJ file to a .LIB file; e.g., EXTEND.LIB. Note: You may delete the #translate line from MYNAME.CH. 4) Replace all ALLTRIM(cVar) references in your .PRG with LTRIM(TRIM(cVar)). Note See Support Bulletin 4 in the NANFORUM Library. seealso "RIGHT()" "STD.CH" ---------------------------------------------------------------------------- APPEND 'Sticks' at EOF() ??. ~ Clipper Version 1.03 dtd 09/15/90. Problem Statement The following is extracted from a message posted by ron 70671, 156: When appending records to a file and successfully writing to and unlocking that record, a SKIP -1, or lookup with the SEEK command, results in the record pointer going to EOF(). GO TOP and GO BOTTOM do not work and neither does SKIP -1. Cause Unknown Work Around(s) Close .dbf and re-open for subsequent operations. Notes Netware 386 3.1 LAN with MS-DOS 4.01 and 3.3 workstations. 35 files open. Problem not reproducible with same database and only 4 other files open. Index and .dbf are updated successfully. ---------------------------------------------------------------------------- ARRAYS/Externals AADD() and ASIZE() .. Incompatible with C/ASM. ~ Clipper Version 1.03 dtd 09/15/90. Problem Statement If an array is declared using the form: LOCAL aArray := {} and AADD() or ASIZE() are used to size the array, the array is not compatible with externals such as C and ASM. Cause Unknown Work Around(s) If the array is declared and sized using the form: LOCAL aArray[20] it can be used with C and ASM. ---------------------------------------------------------------------------- ASORT() Array sort with NIL elements out of order. Clipper Version 1.03 dtd 09/15/90. Problem Statement When ASORT() is used on an array containing NIL elements, the last non-NIL data will appear in the last element; e.g., AA, BB, NIL, NIL, CC. Cause Unknown. Work Around(s) After sorting an array which contains NIL elements, perform the following operation: FOR i = LEN(aArray) TO 1 STEP -1 IF aArray[i] = NIL ADEL(aArray,i) ENDIF NEXT which will place all NIL elements at the end of the array; e.g., AA, BB, CC, NIL, NIL. ---------------------------------------------------------------------------- BOF() Set to .F. on each database access. Clipper Version 1.03 dtd 09/15/90. Problem Statement 1) BOF() is reverts to .F. each time the database is accessed; e.g., IF .and. BOF() will always return .F. where might be something like IF field_data == "something". 2) BOF() will return .T. under the following example: USE test GO LASTREC() + 1 ? BOF() // => .T. Cause Unknown. Work Around(s) 1) Assure that BOF() is evaluated before evaluating other database items. In the example above, change it to read IF BOF() .and. . ---------------------------------------------------------------------------- BASE50.PLL Pre-linking with this file may 'hang' the system. Clipper Version 1.03 dtd 09/15/90. Problem Statement A user, without EMS, reported that his system 'hung' when indexing a 7674 record file containing a 6 character field. He was pre-linking BASE50.PLL Cause Unknown. Work Around(s) In the reported incident, the problem was cured by NO pre-linking or pre-linking with Roger Donnay's, FULLBASE.PLL. See FAST50.ZIP in NANFORUM's LIB 17. seealso "INDICES" "MEMORY/VMM" ---------------------------------------------------------------------------- CALL()* Parameters are passed in reverse order. Clipper Version 1.03 dtd 09/15/90. Problem Statement When CALL proc WITH a, b, c is executed the receiving procedure will receive the parameters as c, b, a. Cause Unknown. Work Around(s) Reverse order of parameter list or use extend system. seealso "EXTEND System" ---------------------------------------------------------------------------- CLD Debugger anomalies. Clipper Version 1.03 dtd 09/15/90. Problem Statement 1. Linking CLD.LIB, as a LIB, does not work. 2. RESTART command does not work, gives SYNTAX ERROR. 3. PASS POINTS does not work as described in documentation. 4. LIST only lists Break Points not Watch Points and Trace Points. 5. F6 DBF file view: Moving in alist of tables when one or more is empty or EOF() causes the debugger to bomb. 6. Only one command line parameter is recognized; i.e., when CLD testprog par1 par2 is executed, par2 is NIL. 7. Other. See CLDBUG.ZIP in the NANFORUM LIB for 4 other anomalies; i.e., date display, ambiquous variables, erroneous commands and accessing the error class exported variable e.args. Cause Unknown. Work Around(s) 1. Link CLD.LIB as an .OBJ; i.e., RTLINK FI yourfile, CLD.LIB 2. Unknown. 3. Use 'PASSPOINT' instead of 'PP'. 4. Unknown. 5. Pressing a menu hot key and RESTART off the menu will get things back in order. 6. Unknown. 7. See referenced file. ---------------------------------------------------------------------------- CLOSE-UP Problem with CLOSE-UP remote operation. Clipper Version 1.03 dtd 09/15/90. Problem Statement Keys not recognized when using CLOSE-UP remote operation, specifically in MENU TO operation. Cause Incorrect CLOSE-UP settings. Work Around(s) Set CLOSE-UP keys to Advanced (requires version 3.0A). ---------------------------------------------------------------------------- COL() Returns start of 'get' display vs end in S'87. Clipper Version 1.03 dtd 09/15/90. Problem Statement COL() returns the column at the start of a get display in Clipper 5.0 vis-a-vis the end of the get display in Summer '87. Cause Unknown. Work Around(s) Adjust screen display commands accordingly or use the new Get Class functions; e.g., ... @ 0,0 say "Input" GET VALID myfunc READ FUNCTION myfunc LOCAL g := getactive() @ g:row, g:col + len(g:buffer) + 1 SAY '' RETURN .t. ---------------------------------------------------------------------------- COMPILER Miscellaneous observations. ~ Clipper Version 1.03 dtd 09/15/90. Observations 1) IF the /P parameter is used in SET CLIPPERCMD and in the command line, the result is no .ppo file. 2) Fatal compiler errors, or aborting the compile, will leave, what one user has dubbed, 'compiler turds'; i.e., compiler working files on your disk. 3) Reminder, per the manual, pg. 3-2, SET CLIPPERCMD or command line options MUST be separated by a space (or the remainder will be ignored). 4) /O Compiler Option ( Programming and Utilities Guide, pg 3-10) If only a path is supplied, it must end with \. ---------------------------------------------------------------------------- DBEVAL() Documentation interpretation. ~ Clipper Version 1.03 dtd 09/15/90. Problem Statement DBEVAL() documentation states that DBEVAL() returns NIL. This statement should not limit your imaginative use of this function, as illustrated below. Cause Not Applicable. Work Around(s) Not Applicable. Notes: * This example fills a multi-dimensional array with the contents of a ~ * .dbf file using DBEVAL and AEVAL. * It also demonstrates the dynamic attribute of STATIC arrays and * use of AEVAL's undocumented, second variable. STATIC aArray := {} LOCAL n, y CLS ; USE test NEW ; ASIZE(aArray,LASTREC()) DBEVAL( {|| ; aArray[RECNO()] := {} , ASIZE(aArray[RECNO()], FCOUNT()), ; AEVAL(aArray[RECNO()],{|x,e| aArray[RECNO(),e] := FIELDGET(e)} ) } ) USE QOUT() ; QOUT() AEVAL(aArray, { |x,e| AEVAL(aArray[e], { |x| QQOUT(x), QQOUT(" ") }), ; QOUT() }) seealso "AEVAL()" ---------------------------------------------------------------------------- DBU Miscellaneous anomalies. ~ Clipper Version 1.03 dtd 09/15/90. Problem Statement 1) If you try to change the name of a memo field, of an existing indexed (with DBU) database, and answer 'Yes' to the warning that 'Memos will be lost..'; you will lose all the records in your database as well. 2) You may end up in an 'run-away' situation (Alt C to break) in the following set of circumstances: (Note: files containg 1000+? records) a) Open a database and Index with DBU. b) (F5) Browse the database. c) Before the screen has completely refreshed the database information, press (F7) to perform a seek operation (select seek). d) Enter an index key and 'Watch the fun begin'. (Thanks Kelly!) Cause Unknown. Work Around(s) Unknown. ---------------------------------------------------------------------------- SET DELETED ON DELETED() records may still be visible. ~ Clipper Version 1.03 dtd 09/15/90. Problem Statement Under certain combinations of physical file order (adjacent records), indexing and filtering, it can be shown that DELETED() records in a file may remain visible. Cause Unknown. Work Around(s) Test for DELETED() records; i.e.; in an example, the following showed a deleted record. Adding .AND. .NOT. DELETED() to the filter cured the problem. Thanks to a user for submitting test program, files, et al! SET DELETED ON USE test NEW SET INDEX TO test SET FILTER TO ..... GO TOP WHILE .NOT. EOF() ? DELETED() SKIP END ---------------------------------------------------------------------------- DELIMITED | SDF COPY TO or APPEND FROM anomalies. Clipper Version 1.03 dtd 09/15/90. Problem Statement COPY and APPEND commands, using certain delimiters, do not produce the desired result. Further, certain APPEND FROM commands will append junk until all available disk space is exhausted. Cause Unknown. Work Around(s) Unknown. Nantucket to supply. Notes: 1) COPY commands; using SDF, DELIMITED or DELIMITED WITH comma; work. 2) APPEND commands; using SDF, DELIMITED or DELIMITED WITH comma; work, only if the text file ends in ^^Z or . Caution! APPEND will try to append 'records' until out of disk space, causing a crash. 3) DELIMITED WITH commands, other than those above, fail to produce the desired results. A hi-bit character will be used as the delimiter. 4) The Detroit Area Clipper Users Group BBS (313-651-7841) has a file, DBAPPDEL.ZIP (E. Mark Kothe) which contains a program for appending with a BLANK delimiter. ---------------------------------------------------------------------------- DIRECTORY() Resultant array may == NIL. Clipper Version 1.03 dtd 09/15/90. Problem Statement The array created by the DIRECTORY() function will == NIL if no files meet the or the is not valid. Work Around(s) Annotate your documentation. Test result for NIL. ---------------------------------------------------------------------------- ERRORSYS.PRG Not compatible with S'87. Clipper Version 1.03 dtd 09/15/90. Problem Statement Clipper 5.0's ERRORSYS.PRG is incompatible with S'87 routines. Work Around(s) A user has uploaded ERRSUB.ZIP to NANFORUM to resolve differences. ---------------------------------------------------------------------------- EXTEND System Changes made to a variable may effect other variables. Clipper Version 1.03 dtd 09/15/90. Problem Statement When a pointer points to more than one variable and one of the variables is changed in an ASM or C function, the other variables may be changed. Work Around(s) a) Make a local copy of the variable and pass it to the function. b) Break the pointer relationship before passing the variable. Notes This subject is slightly over the author's head, so forgive the terminology . a) The following is an abstract of a forum message on the subject: Fm: Pedro P. Polakoff [3PS] 73157,2412 Here is code that will demonstrate that: 1. _parc() returns a pointer to the actual data. 2. cVar1:=cVar2:="Foobar" points both variables at the same block of memory much as a C char * does. CLIPPER PORTION --- static cVar1 static cVar2 function str_test cVar1:=cVar2:="Foobar" // HERE IS THE ASSIGNMENT QOut(cVar1,cVar2) ChangeStr(cVar2) // NOTE NOT PASSED BY REFERENCE QOut(cVar1,cVar2) return(NIL) C PORTION --- #include CLIPPER changestr() { char *str; register int p; byte q='A'; if(PCOUNT==1 && ISCHAR(1)){ str=_parc(1); // pointer to pointer for(p=0;p<_parclen(1);p++){str[p]^=q;} // directly changed } _ret(); // NIL return } b) Another example can be found in EXTBUG.ZIP in the NANFORUM LIB 17. Uploaded by Francois Batte 70022,3424. seealso "CALL()*" ---------------------------------------------------------------------------- FCREATE Norton Guide documentation error. Clipper Version 1.03 dtd 09/15/90. Problem Statement FCREATE's attribute definition is incorrect in the Norton Guide. Work Around(s) Use the documentation in the manual or refer to FILEIO.CH. The correct attributes are: 0 Create normal read/write file (default) 1 Create read-only file 2 Create hidden file 4 Create system file ---------------------------------------------------------------------------- FIELDWBLOCK() Does not work per 'Guide' description. Clipper Version 1.03 dtd 09/15/90. Problem Statement FIELDWBLOCK(, ) does not access nWorkArea; e.g., USE test1 ALIAS one NEW; nOne:= Select() // cFieldName is keyid USE test2 ALIAS two NEW; nTwo:= Select() // cFieldName is last_name ? EVAL(fieldwblock ("last_name", nTwo)) // works ok. ? EVAL(fieldwblock ("keyid", nOne)) // does not work. Work Around(s) as submitted by MIKE SCHINKEL 73567,3612. USE test1 ALIAS one NEW; nOne:= Select() USE test2 ALIAS two NEW; nTwo:= Select() ? one->( EVAL( FieldWBlock( "keyid", nOne ) ) ) // Both these ? ( nOne )->( EVAL( FieldWBlock( "keyid", nOne ) ) ) // are same. ? two->( EVAL( FieldWBlock( "last_name", nTwo ) ) ) // Both these ? ( nTwo )->( EVAL( FieldWBlock( "last_name", nTwo ) ) ) // are same. Notes A description of FIELDWBLOCK's behaviour, as submitted by Manuel Gonzalez 71121,1442, is as follows: 1) If the work-area number fed to FIELDWBLOCK is the same as the current work area and the field exists, it returns the field's value when it's EVALuated. 2) If the work-area number fed to FIELDWBLOCK is the same as the current work area and the field does not exist, it returns NIL. 3) If the work-area number fed to FIELDWBLOCK is not the same as the current work area and the field does not exist in the work area specified, ERRORSYS says: "Variable does not exist: (fieldname)." 4) If the work-area number fed to FIELDWBLOCK is not the same as the current work area and the field DOES exist in the work area spe- cified, FIELDWBLOCK returns NIL. EVALuating FIELDWBLOCK bombs. ---------------------------------------------------------------------------- GETSYS.PRG Modifications and corrections. ~ Clipper Version 1.03 dtd 09/15/90. Problem Statements 1) Unable to enter characters having an ASCII value > 127 in GET's. 2) Control W or Control End exits getlist. 3) Unable to enter negative decimal numbers using decimal point movement. 4) When a GET ... WHEN command is issued and a condition dependent entry is at the top or bottom of the getlist, the system appears to lock up. 5) An 'unselected' color setting is ignored until the GET is entered ~ and exited. Cause 1) Line 413 of an unmodified GETSYS.PRG reads as follows: if (nKey >= 32 .and. nKey <= 127) 2) GETSYS.PRG option 3) Unknown. 4) GETSYS.PRG programming error. 5) Unknown. Work Arounds 1) Line 413 may be edited, with caution, to permit a greater range of entries. Check for conflicts with any SET KEY's or SET FUNCTION's. GETSYS.PRG should be compiled and linked with your .PRG. 2) The GETSYS.PRG has an #ifdef NOTDEF in the program. If you #define NOTDEF at the beginning of the file, CTRL W and CTRL END will move to the last valid item of the getlist. 3) Enter negative decimal numbers, with PICTURE template #, as spaces up to the position before the decimal point, then minus, then number OR enter minus, then zeros until cursor jumps past decimal point, then number. 4) The following changes to GETSYS.PRG will correct the problem. 5) Unknown. Note: This group of changes should be ignored if the 'Ira' fixes, below, are incorporated. ******************************************************************** The changes commence at line 242 of the original program. // 242 if (localReadExit) i := 0 // 244 else // 245 i := 0 // 246 direction := BACKWARD // 247 end end else if ( --i < 1 ) * going backward, at top of getlist if (localReadExit) i := 0 else i := 2 // changed 255, was i := 1 ******************************************************************** GETSYS.PRG should be compiled with the /N option and linked with your .PRG. Note: The following changes to GETSYS.PRG have been submitted by Ira Emus (76702,672) to 'fix a bunch of anomalies you might find when using the WHEN keyword.' : ******************************************************************** 186 LOCAL nKey := 0, cKey // change 242 IF (LocalReadExit) .OR. nKey == K_ENTER // change 246 i := nLen-1 // change 256 i := 2 // change 334 new := if( localReadExit, 0, 1 ) // reference 335 GetExitRequested := new == 0 // Add 341 new := if( localReadExit, 0, nLen ) // reference 348 GetExitRequested := new == 0 // Add 183 local g, passcount := 0 // change 246 direction := BACKWARD // reference 247 passcount++ // add 256 direction := FORWARD // reference 257 passcount++ // add 260 IF passcount = 2 // add 261 i := 0 // add 262 ENDIF // add 263 loop // reference 264 end // reference 265 passcount := 0 // add 260 g:display() // Add 261 loop // reference ******************************************************************** The above 'Ira' changes have been 're-ordered' by another user as follows: "The changes are reordered so that the added lines are in reverse order so that line numbers don't change their reference line number. 183->182 means 'Ira' code showed line 183 but it should have been 182. Changed Lines: 183->182 local g, passcount := 0 // change 186->185 LOCAL nKey := 0, cKey // change 242 IF (LocalReadExit) .OR. nKey == K_ENTER // change 246->245 i := nLen-1 // change 256->255 i := 2 // change Added Lines: 341->334 new := if( localReadExit, 0, nLen ) // reference 348->335 GetExitRequested := new == 0 // Add 334->327 new := if( localReadExit, 0, 1 ) // reference 335->328 GetExitRequested := new == 0 // Add These 7 line numbers are difficult to tell exactly where g:display() goes since two changes were made here. They've been combined. Original code reference: 263->260 loop // reference 264->261 end // reference After additions (with new line numbers for loop and end). 260 IF passcount = 2 // add 261 i := 0 // add 262 ENDIF // add 260->263 g:display() // add 263->264 loop // reference 264->265 end // reference 265->266 passcount := 0 // add These four lines are correct. 256 direction := FORWARD // reference 257 passcount++ // add 246 direction := BACKWARD // reference 247 passcount++ // add " Note Author's note: I think the 'differences' may be due to Version 1.02 vs. 1.03 - hope everyone can decipher 'em. Thanks to Ira! seealso "\SOURCE\SYS" "READ" "PICTURE" ---------------------------------------------------------------------------- Get:Delete() Documentation omission. Clipper Version 1.03 dtd 09/15/90. Problem Statement Get:Delete() Syntax is not in documentation. Cause Documentation omission. Work Around(s) Annotate your documentation to add the definition to the GET Class, Cursor Movement Methods definitions delete() Deletes the character under the cursor ---------------------------------------------------------------------------- GetNew() Error in syntax documentation. Clipper Version 1.03 dtd 09/15/90. Problem Statement GetNew() Syntax is not correct in documentation. Cause Error in documentation. Work Around(s) Edit your documentation to reflect the correct syntax: GetNew([], [], [],[],[], []) --> objGet ---------------------------------------------------------------------------- Get:VarGet() Get Class, missing manual documentation. Clipper Version 1.03 dtd 09/15/90. Problem Statement The definition of VarGet() is missing from the manual, but included in the Norton(r) Guide. Cause Ommission. Work Around(s) Annotate your manual to include VarGet() as follows: varGet() Returns the current value of the Get variable ^r^CEA^r varGet() --> GetVarValue Returns the current value of the Get variable. For simple Get variables this is equivalent to executing Get:block: aGet:varGet() == EVAL(aGet:block) However, if the Get variable is an array element, EVAL(aGet:block) will not return the value of the Get variable; in this case use of varGet() is required. An example of varGet() may be found in the READMODAL() function, defined in Getsys.prg. ---------------------------------------------------------------------------- Get:VarPut() Get Class, missing manual documentation. Clipper Version 1.03 dtd 09/15/90. Problem Statement The definition of VarPut() is missing from the manual, but included in the Norton(r) Guide. Cause Ommission. Work Around(s) Annotate your manual to include VarPut() as follows: varPut() Sets the Get variable to the passed value ^r^CEA^r varPut() --> Value Sets the Get variable to the passed value. For simple Get variables this is equivalent to executing Get:block with an argument: aGet:varPut(aValue) == EVAL(aGet:block, aValue) However, if the Get variable is an array element, EVAL(aGet:block, aValue) will not set the value of the Get variable; in this case use of varPut() is required. ---------------------------------------------------------------------------- IF() Use with caution with commands and statements. Clipper Version 1.03 dtd 09/15/90. Problem Statement IF() will be pre-processed as though it was the IF command and a compiler error will occur; e.g., SET RELATION TO field + IF()) ---------------------------------------------------------------------------- IF nX == 0 May return incorrect logic. Clipper Version 1.03 dtd 09/15/90. Problem Statement Given the assignment, nX := 0.6, the test, IF (nX == 0) will return true. Cause Unknown. Workaround(s) 1) IF nX == 0.0 works ok. 2) IF 0 == nX or IF 0.0 == nX work ok. 3) IF | IFF( nX == 0, action1, action2 ) work ok. 4) IF ROUND( nX, 2 ) == ROUND( 0, 2 ) works ok. ---------------------------------------------------------------------------- INCREMENT RTlink option, problems. Clipper Version 1.03 dtd 09/15/90. Problem Statement Users have reported problems when attempting to use the Incremental Linking feature of RTLINK. Cause Unknown. Work Around(s) Avoid the use of this feature until a fix is available. ---------------------------------------------------------------------------- INDICES Numerous reported problems. Clipper Version 1.03 dtd 09/15/90. Problem Statement Numerous reported problems re' indices; e.g., SEEK's, SET RELATION TO's and PACK's. Numerical indices containing appended blanks are out of order. Indexing on a child relation will destroy the child's index. Cause Unknown. Work Around(s) Unknown. Suggest use of character type index keys. The following function will handle negative numbers and treat blanks as zeros. FUNCTION num2str(nNumber) RETURN ( PADL(LTRIM(STR(IF(nNumber<0,ABS(1/nNumber),nNumber),; LEN(STR(nNumber))+2,LEN(STR(nNumber))-AT(".",STR(nNumber))+2)),; LEN(STR(nNumber))+2,IF(nNumber<0,"-","0")) ) A workaround for indexing on a child's data is to use a UDF. Example: SELECT 2 USE test2 ALIAS S INDEX ON key_id TO test2 SELECT 1 USE test1 ALIAS P INDEX ON RELFUNC(P->key_id) TO test1 FUNCTION RELFUNC(idkey) LOCAL cRetVal SELECT 2 SEEK idkey cRetVal = IF( !S->(EOF()), S->last_name+S->first_name,; SPACE(LEN(S->last_name+S->first_name)) ) SELECT 1 RETURN cRetVal Note: The index file created by indexing on a number field has a different internal representation depending upon whether the file was created by Summer '87 or Clipper 5.0. seealso "MEMORY/VMM" "PACK" "SET RELATION" ---------------------------------------------------------------------------- INSTALL Installation Problems See Support Bulletins 1 and 2 in NANFORUM LIB 16. ---------------------------------------------------------------------------- LABEL FORM A runtime error occurs on second execution. Clipper Version 1.03 dtd 09/15/90. Problem Statement If the user attempts to execute a second label report, a runtime (assignment) error will occur. Cause LBLRUN.PRG programming error. Work Around(s) Edit lines 115 to 119 of the original LBLRUN.PRG as follows: aLabelData := {} aBandToPrint := {} nCurrentCol := 1 cBlank := "" lOneMoreBand := .T. Re-compile and link with programs requiring LABEL FORM. seealso "NOCONSOLE" "SET CONSOLE" ---------------------------------------------------------------------------- LOCAL Inline assignment clarification. Clipper Version 1.03 dtd 09/15/90. Clarification: Inline assignments of the following form: LOCAL a := b := c:= 0 result in LOCAL a and PRIVATE b and c ---------------------------------------------------------------------------- MANUAL Missing documentation. Clipper Version 1.03 dtd 09/15/90. As noted in the README file, the following function or statement definitions are missing from the manual: BREAK() Branch out of a BEGIN SEQUENCE...END construct F DECLARE* Create and initialize private memory variables and arrays S DEVOUT() Write a value to the current device F FIELDBLOCK() Return a set-get code block for a field variable F FIELDGET() Retrieve the value of a field variable F FIELDPUT() Set the value of a field variable F FIELDWBLOCK() Return a set-get block for a field in a given work area F GETACTIVE() Return the currently active Get object F MEMVARBLOCK() Return a set-get code block for a given memory variable F OUTERR() Write a list of values to the standard error device F OUTSTD() Write a list of values to the standard output device F SETBLINK() Toggle asterisk (*) interpretation in SETCOLOR() F SETMODE() Change display mode to specified number of rows, columns F Note: These definitions have been uploaded as MAN001.TXT and MAN002.TXT in the NANFORUM library. The following match-marker description is also missing from the manual: <(idMarker)> Extended Expression match-marker ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Extended Expression match-marker: matches a regular or extended expression, including a filename or path specification. It is used in combination with the smart stringify result-marker to assure that extended expressions won't get stringified, while normal, unquoted string file specifcations will. ---------------------------------------------------------------------------- MEMORY/VMM Numerous reported VMM crashes. Clipper Version 1.03 dtd 09/15/90. Problem Statement Numerous problems have been reported re' memory related crashes. Cause Unknown. Work Around(s) Unknown, however: a) One user, Pedro P. Polakoff [3PS] 73157,2412 reports: Anyone who is having problems with the VMM error: 5317 (Swap space exhausted), especially when using linker's other than RTLink, can solve the problem by using the following function call: Function VMMKickStart() local cDummy:=Space(8000) // Warplink Base -- or -- local cDummy:=Space(16000) // Blinker Base return(NIL) as the very first executed line of your program. b) If the system locks up when indexing, and you linked WITH BASE50.PLL, try linking WITHOUT BASE50.PLL or linking with Roger Donnay's suggested FULLBASE.PLL. (See FAST50.ZIP in NANFORUM LIB 17, New Uploads.) Notes See Support Bulletins 3 and 4 in NANFORUM LIB 16. ---------------------------------------------------------------------------- MENU TO w/SETKEY Setkey() receives incorrect parameters. Clipper Version 1.03 dtd 09/15/90. Problem Statement The set key procedure does not receive the correct parameters for cproc, cline and, cvar. Cause Unknown. Work Around(s) 1) Tech support at Nantucket suggests the following work around to be placed at the top of all setkey() procedures : if procname(3) == "__MENUTO" cproc := procname(4) else cproc := procname(3) endi 2) The following alternative(s) have been suggested by a user. First create an #include file called BUGFIX.CH as follows: #define FIXCPROC procname(if(procname(3)=='__MENUTO',4,3)) #define FIXCLINE procline(if(procname(3)=='__MENUTO',4,3)) #define FIXCVAR readvar() and modify your set key procedure by placing the following at the top of each procedure: cproc := FIXCPROC cline := FIXCLINE cvar := FIXCVAR OR (Combination of above.) #define FIXCPASS(x,y,z); x := procname(if(procname(3)=='__MENUTO',4,3)) ;; y := procline(if(procname(3)=='__MENUTO',4,3)) ;; z := readvar() Place the following at the top of setkey procedures: FIXCPASS(cproc,cline,cvar) seealso "PROCNAME()" ---------------------------------------------------------------------------- MISC Miscellaneous clarification/anomalies. ~ Clipper Version 1.03 dtd 09/15/90. a) CL.BAT (Support Bulletin S50004.TXT) This batch file was not supplied with Clipper 5.0. Here are the intended contents: CLIPPER %1 RTLINK FI %1 b) NDX File Support ( Card contained with Clipper 5.0 ) You must request this feature from Nantucket(r). Not available as of late November. c) SETBLINK(), SETMODE() (NG Function Descriptions) These are environmental or screen attributes; hence, they may change the full screen when invoked. SETMODE() should be followed by a CLS or CLEAR SCREEN. You may want to save the screen before invoking either of these functions. d) MEMVARBLOCK() (NG Function Description) MEMVARBLOCK() cannot be used to create set-get blocks for LOCAL or STATIC variables. e) A 'splash of color' may remain at 0, 65 after using SETCOLOR() and GET. This can be eliminated by SET SCOREBOARD OFF. f) Code block parameter visibility - documentation anomaly. Page 1-21 of the Clipper 5 Reference, last sentence, 2nd paragraph reads: "....a declaration that occurs within a code block (a block parameter), applies to that code block and any code blocks nested within it.". The block parameter IS NOT visible to nested code blocks, unless you pass it. g) In certain incidences, terminating a macro expression with a period, '.', does not work; e.g., FUNCTION IndexFile(cKey, cIndexName) INDEX ON &cKey. TO (cIndexName) RETURN (NIL) Result: Compiler "Error C2081 Macro of declared symbol: '&cKey.' h) Menu.prg example on page 1-2 of the Reference Manual has as its first line '#include "Database.prg" ...'. This directive should be placed at the end of the program (it includes generic database functions). i) Cursor anomalies. Try using SET CLIPPER=CGACURS if you are experiencing cursor anomalies. Reference: NG Environment. j) Re-direction. Clipper 5.0 does not accept command line parameters re-directed from a text file; e.g. CLIPPROG < TEXTFILE. k) Internal Error Numbers are not documented. l) STATIC arrays. Documentation anomaly, pg. 1-57. Contrary to the documentation, STATIC arrays are also dynamic. m) The following program results in a run-time error because x was not initialized; however, the error message, "Error BASE/1087 Argument error: -- " should reference ++ instead. function main local x x++ return nil ---------------------------------------------------------------------------- MULTI-STATEMENT Multi-statement lines, CAUTION. Clipper Version 1.03 dtd 09/15/90. Problem Statement When using multiple statements on one programming line; i.e.; separating commands with a semi-colon; there are several commands which will cause erroneous results, if they are not at the end of line. Cause Pre-processor action. Work Around(s) Make sure that the following commands, if used, appear at the end of the line, ONLY. ENDDO <*x*> SET STEP <*x*> ENDIF <*x*> SET SAFETY <*x*> ENDCASE <*x*> SET TALK <*x*> ENDFOR <*x*> SET PATH TO <*path*> SET ECHO <*x*> SET COLOR TO <*spec*> SET HEADING <*x*> SET COLOUR TO <*spec*> SET MENU <*x*> RUN <*cmd*> SET STATUS <*x*> ! <*cmd*> COPY TO <(file)> DELIMITED WITH <*delim*> APPEND FROM <(file)> DELIMITED WITH <*delim*> seealso "STD.CH" "DELIMITED | SDF" "SET COLOUR" ---------------------------------------------------------------------------- Numerics Problem with numbers > 2 ** 31. Clipper Version 1.03 dtd 09/15/90. Problem Statement Certain large numbers, entered as variables, return unexpected values. Examples: Assignment ? nVar nVar := 4503599627436033 => 4503599627436033 nVar := 4503599627436032 => 4503599627436032 nVar := 4503599627436031 => 65535 nVar := 4503599627403264 => 35868 nVar := 4503599627403263 => 32767 nVar := 4503599627370498 => 2 nVar := 4503599627370497 => 1 nVar := 4503599627370496 => 0 // 2 ** 54 nVar := 4503599627370495 => -1 nVar := 4503599627370494 => -2 nVar := 4503599627337729 => -32767 nVar := 4503599627337728 => 4503599627337728 nVar := 4503599627337727 => 4503599627337727 Cause Unknown. Work Around(s) Append '.0' to the variable at assignment; e.g., nVar := 4503599627370496.0 => 4503599627370496.0 Notes The above example 'ranges' about 2 ** 54. Similar, but not identical, results will occur when nVar > 2 ** 31. Attempts to assign nVar as ROUND(nNumber,nPlaces) or nNumber * 1.0 failed to cure the problem; however, if nVar is created as a result of say 2 ** 32, the assignment appears to be correct. ---------------------------------------------------------------------------- NG MODE Un-documented Norton(r) Guide Mode. Clipper Version 1.03 dtd 09/15/90. Problem Statement NG can be executed in a mode which will permit it to unload from memory when F10 or Escape is used to exit the program. Cause Documentation omission. Work Around(s) Enter NG TEST.NG at the DOS prompt. When NG receives the specific parameter TEST.NG, it will load in the above described mode. Annotate your documentation. Note TEST.NG is the specific parameter to be used. This is NOT the name of an existing file. ---------------------------------------------------------------------------- NOCONSOLE Not documented as REPORT | LABEL FORM option. Clipper Version 1.03 dtd 09/15/90. Problem Statement NOCONSOLE parameter to REPORT | LABEL FORM .. commands is missing. Cause Syntactical ommissions in documentation. Note: FRMRUN.PRG | LBLRUN.PRG programming uses the presence | absence of a NOCONSOLE parameter to SET CONSOLE accordingly. See SET CONSOLE for re-programming solutions. Work Around(s) 1) Change documentation to reflect addition of this parameter: REPORT | LABEL FORM [TO PRINTER] [TO FILE ][] [WHILE ] [FOR ][PLAIN | HEADING ] [NOEJECT] [SUMMARY] [NOCONSOLE] ---------------------------------------------------------------------------- OS() Does not return user's operating system. Clipper Version 1.03 dtd 09/15/90. Problem Statement OS() returns the operating system programmed into EXAMPLP.PRG. Cause Incorrect documentation or non-implementation of function. Work Around(s) 1) Change documentation to reflect true action of this function. 2) Edit EXAMPLEP.PRG to reflect the desired system, compile and link with your program. ---------------------------------------------------------------------------- PACK PACK's with multiple open indices may fail. Clipper Version 1.03 dtd 09/15/90. Problem Statement PACK's with multiple indices may fail. The BADPAC.ZIP file on NANFORUM illustrates the problem. Cause Unknown. Suspect indexing procedure. Work Around(s) Close indices before PACKing. Re-index the files, using INDEX ON rather than REINDEX. Some users recommend erasing the index files prior to usage of the INDEX ON. Otherwise, design your program so that PACK's are not required. seealso "REINDEX" "INDICES" ---------------------------------------------------------------------------- PICTURE Anomalies with the PICTURE clause. Clipper Version 1.03 dtd 09/15/90. Problem Statement 1) PICTURE "Y" May return lowercase, if character type variable. Using @ , GET PICTURE "Y" OR Using @ , SAY GET PICTURE "Y" will not force UPPER(cVar); i.e., cVar returned will be the same case as entered by the user. 2) PICTURE "@R